package com.jinzhu.common.httpclient;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.util.Map;

@Slf4j
public class HttpJsonUtil {

    /**
     * 将Json字符串转成Map
     *
     * @param jsonString
     * @return map
     */
    public static Map parseJsonToMap(String jsonString) {
        Map map = JSON.parseObject(jsonString, Map.class);

        log.info("Json转Map:{}", map);
        for (Object obj : map.keySet()) {
            System.err.print(obj + "-" + map.get(obj));
        }
        return map;
    }

    /**
     * 将Map转换成Json
     *
     * @param map
     * @return
     */
    public static String parseMapToJson(Map<String, Object> map) {
        String json = JSON.toJSONString(map);
        log.info("Map转Json:{}", json);
        return json;
    }

    /**
     * 将实体转换成Json
     *
     * @param obj
     * @return
     */
    public static String parseEntityToJson(Object obj) {
        String json = JSON.toJSONString(obj);
        log.info("实体类转Json:{}", json);
        return json;
    }

    /**
     * 将Json转换成实体
     *
     * @param jsonStrin
     * @param cs
     * @return
     */
    public static Object parseJsonToEntity(String jsonStrin, Class cs) {
        Object o = JSON.parseObject(jsonStrin, cs);
        log.info("Json转实体类:{}", o);
        return o;
    }

    /**
     * json格式转Get
     * <p>
     * 案例
     * {
     * "data":{
     * "box_size":3,
     * "client_order_id":"72755da14c35",
     * "client_shipment_code":"72755da14c28",
     * "merchant_id":"457",
     * "product_name":"Product A",
     * "remarks":""
     * }
     * }
     * <p>
     * 第一行是替换{}为null 第二行是替换 data:为null   第三行是替换\ ' 为null第  四行是替换: 为=  替换,为& 第五行是去掉首位 空
     * <p>
     * <p>
     * 最终结果
     * <p>
     * box_size3&
     * client_order_id72755da14c35&
     * client_shipment_code72755da14c28&
     * merchant_id457&
     * product_nameProduct A&
     * remarks
     *
     * @param body
     * @return
     */
    public static String jsonToGet(String body) {
        //第一行是替换{}为null 第二行是替换 data:为null   第三行是替换\ ' 为null第  四行是替换: 为=  替换,为& 第五行是去掉首位 空
        String trim = body.replace("{", "").replace("}", "").
                replace("\"data\":", "").
                replace("\"", "").replace("'", "").
                replace(":", "=").replace(",", "&").trim();
        //去掉每个&后空保留中间位置的空格字符

        String[] split = trim.split("&");
        StringBuffer buffer = new StringBuffer();
        for (String s : split) {
            //&符合太多则去掉
            if (s.indexOf("=") == -1) {
                buffer.append("," + s);
                continue;

            }   //找指定重复的字符吧除外的一个的字符进行替换 主要针对日期时分秒
            int num = appearNumber(s, "=");
            for (int i = 0; i < num; i++) {
                s = s.replaceAll("(=)(.*?)(\\1)(.*?)", "$1$2:$4");
            }
            buffer.append(s.trim() + "&");
        }
        //去掉最后一个&号
        return buffer.substring(0, buffer.length() - 1);
    }

    /**
     * 找重复字符出现的次数
     * public int indexOf(int ch, int fromIndex) * 返回在此字符串中第一次出现指定字符处的索引，从指定的索引开始搜索 *  * @param srcText * @param findText * @return
     */
    public static int appearNumber(String srcText, String findText) {
        int count = 0;
        int index = 0;
        while ((index = srcText.indexOf(findText, index)) != -1) {
            index = index + findText.length();
            count++;
        }
        return count;
    }


}
